table of contents
regcomp(3) | 2007-10-27-16:31 | regcomp(3) |
НАЗВА¶
regcomp, regexec, regerror, regfree - функції регулярних виразів POSIX
СТИСЛИЙ ОГЛЯД¶
#include <sys/types.h>
#include <regex.h>
int regcomp(regex_t *preg, const char *regex, int cflags);
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);
void regfree(regex_t *preg);
КОМПІЛЯЦІЯ РЕГУЛЯРНИХ ВИРАЗІВ POSIX¶
regcomp служить для "компіляції" регулярного виразу і надання йому форми, придатної для подальших пошуків за допомогою regexec.
regcomp візьме як аргументи: preg - покажчик на область буферу, де компільований шаблон буде збережено, regex - покажчик на ланцюжок з нульовим закінченням і cflags - прапорцi, використовувані для визначення типу компіляції.
Усі пошуки регулярних виразів повинні виконуватись через компільований буферний шаблон, тож regexec завжди отримуватиме адресу буферу, у якому знаходиться бінарний шаблон, компільований regcomp.
cflags може бути порозрядним АБО одного або декількох з наступного:
- REG_EXTENDED
- Використовувати синтаксис розширених регулярних виразів POSIX під час інтерпретації regex. Якщо цей прапор не включено, то використовується синтаксис простих регулярних виразів POSIX.
- REG_ІCASE
-
Не враховувати регістру літер. Наступні пошуки regexec з використанням шаблона у буфері не будуть залежати від регістру. - REG_NOSUB
-
Не вимагати підтримки адресації до частин ланцюжків всередині збігів. Параметри nmatch і pmatch для regexec ігноруються, якщо даний буферний шаблон був скомпільований з цим прапором. - REG_NEWLІNE
-
Оператори, що збігаються з будь-якими символами не співпадатимусть з новим рядком, тим не менш.Негативний список ([^...]), у якому не вказано знаку нового рядка, не збігатиметься автоматично з новим рядком.
Оператори початку рядків (^) співпадатимуть з порожнім ланцюжком одразу після знаку нового рядка незалежно від того, чи eflags, прапор виконання regexec, містить REG_NOTBOL.
Оператор кінця рядка ($) збігатиметься з порожнім ланцюжком перед перед самим символом нового рядка, незалежно від того, чи eflags містить REG_NOTEOL.
СПІВПАДАННЯ З РЕГУЛЯРНИМИ ВИРАЗАМИ POSIX¶
regexec використовується для порівнювання ланцюжків з нульовим закінченням із попередньо-обробленим буферним шаблоном preg. Змінні nmatch та pmatch використовуються щоб отримати інформацію про місцезнаходження будь-яких збігів. eflags може бути порозрядним АБО одного або обох REG_NOTBOL і REG_NOTEOL. Ці значення визначають поведінку процесу порівнювання, як описано нижче.
- REG_NOTBOL
-
Оператор початку нового рядка завжди зазнає навдачі (але дивіться, описаний вище, прапор обробки REG_NEWLІNE). Цей прапор може використовуватись, коли у regexec обробляються окремі частини ланцюжків, і початок таких частин, у даному випадку, не повинен розглядатись як початок нового рядка. - REG_NOTEOL
-
Не береться до уваги оператор кінця рядка (але дивіться, описаний вище, прапор обробки REG_NEWLІNE).
ПОЗИЦІЯ БАЙТІВ¶
Хіба REG_NOSUB було встановлено для обробки буферного шаблону, завжди є можливість отримати інформацію про положення внутрішньо-ланцюжкових збігів. pmatch повинно бути визначена так, щоб мати, принаймні, nmatch елементів. Вони заповнюються regexec-адресами внутрішньо-ланцюжкових збігів. Будь-які невикористані елементи структури будуть містити значення -1.
Структура regmatch_t, що є типом для pmatch, визначено у regex.h:
typedef struct
{
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
ПОВІДОМЛЕННЯ ПРО ПОМИЛКИ ВІДПОВІДНО ДО СТАНДАРТУ POSIX¶
regerror використовується для перетворення кодів помилок, що повертаються обома regcomp і regexec, у рядки повідомлень про помилки.
Через regerror проходять: код помилки errcode, буферний шаблон preg, покажчик на символьний буфер рядка errbuf і розмір буферу рядка errbuf_sіze. Буде повернуто розмір errbuf, необхідного для утримування рядка з нульовим закінченням, містячого повідомленням про помилку. Якщо errbuf і errbuf_sіze не є нульовими, то errbuf заповнюється першими errbuf_sіze - 1 символами повідомлення про помилку і завершуються нулем.
ВИВІЛЬНЕННЯ БУФЕРУ ШАБЛОНУ ВІДПОВІДНО З POSIX¶
Після надання regfree попередньо обробленого буферного шаблону, preg звільнить пам'ять, відведену цьому шаблонові під час процесу компіляції regcomp.
ПОВЕРНЕНЕ ЗНАЧЕННЯ¶
regcomp повертає нуль при успішній компіляції або код помилки у випадку невдачі.
regexec повертає нуль у випадку співпадань або REG_NOMATCH, якщо співпадань не відбулося.
КОДИ ПОМИЛОК¶
regcomp може повертати наступні помилки:
- REG_BADRPT
-
Невірне використання операторів повторення, наприклад '*' як перший символ. - REG_BADBR
-
Невірне використання операторів зворотних посилань. - REG_EBRACE
-
Відсутня пара фігурної дужки. - REG_EBRACK
-
Відсутня пара квадратної дужки (оператори списку). - REG_ERANGE
-
Невірне використання операторів інтервалу: у цьому випадку кінець інтервалу з'являється до його початку. - REG_ECTYPE
-
Невідома назва класу символів. - REG_ECOLLATE
-
Невірний елемент сортування, помилка сортування елементів. - REG_EPAREN
-
Відсутня пара круглої дужки (оператор групування). - REG_ESUBREG
-
Помилкове зворотнє посилання на частину виразу. - REG_EEND
-
Невизначена помилка. (Не описана у POSIX.2.) - REG_EESCAPE
-
Кінцевий зворотній слеш. - REG_BADPAT
-
Невірне використання операторів шаблону, таких як оператори групи або списку. - REG_ESІZE
-
Компільований регулярний вираз вимагає буферний шаблон розміром більшим за 64 Кб. (Не описано у POSIX.2.) - REG_ESPACE
-
Виснаження пам'яті функціями регулярних виразів.
ВІДПОВІДНІСТЬ СТАНДАРТАМ¶
POSIX.2
ДИВІТЬСЯ ТАКОЖ¶
regex(7), GNU regex manual
---- Переклав українською Віталій Цибуляк <vi@uatech.atspace.com>
2007-10-27-16:31 | © 2005-2007 DLOU, GNU FDL |